﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Pavilion.DesignerTool.ViewTools;

namespace Pavilion.DesignerTool
{
    public class LoadNodeWrapper : NodeBaseWrapper
    {
        public IEnumerable<GameItemWrapper> GameItemCollection { get { return gameItemDictionary.Values; } }
        public LoadNode LoadNode { get; private set; }

        private Dictionary<string, GameItemWrapper> gameItemDictionary;

        public LoadNodeWrapper(LoadNode loadNode, NodeScriptWrapper nodeScriptWrapper) : base(loadNode, nodeScriptWrapper)
        {
            this.LoadNode = loadNode;

            gameItemDictionary = new Dictionary<string, GameItemWrapper>();

            foreach (string gameItemName in loadNode.GameItemCollection)
            {
                GameItemWrapper gameItemWrapper = GameItemWrapperManager.GetGameItemWrapper(gameItemName);
                gameItemWrapper.LoadGameTools(this);
                gameItemDictionary.Add(gameItemName, gameItemWrapper);
            }
        }

        public override void Dispose()
        {
            base.Dispose();

            foreach (GameItemWrapper gameItemWrapper in GameItemCollection)
                GameItemWrapperManager.RemoveGameItemWrapper(gameItemWrapper);
        }

        public GameItemWrapper AddGameItem(string gameItemName)
        {
            LoadNode.AddGameItem(gameItemName);
            GameItemTransfer.Add(this, gameItemName);

            GameItemWrapper gameItemWrapper = GameItemWrapperManager.GetGameItemWrapper(gameItemName);
            gameItemDictionary.Add(gameItemName, gameItemWrapper);
            return gameItemWrapper;
        }

        public void RemoveGameItem(string gameItemName)
        {
            LoadNode.RemoveGameItem(gameItemName);
            GameItemTransfer.Remove(this, gameItemName);

            GameItemWrapperManager.RemoveGameItemWrapper(ObtainGameItem(gameItemName));
            gameItemDictionary.Remove(gameItemName);
        }

        public void RenameGameItem(string oldGameItemName, string newGameItemName)
        {
            LoadNode.RenameGameItem(oldGameItemName, newGameItemName);
            GameItemTransfer.Rename(this, oldGameItemName, newGameItemName);

            GameItemWrapper gameItemWrapper = gameItemDictionary[oldGameItemName];
            gameItemWrapper.Name = newGameItemName;

            gameItemDictionary.Remove(oldGameItemName);
            gameItemDictionary.Add(newGameItemName, gameItemWrapper);
        }

        public GameItemWrapper ObtainGameItem(string gameItemName)
        {
            return gameItemDictionary[gameItemName];
        }
    }
}
